package com.hejia.alauda.persistence.mybatis;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import com.hejia.alauda.entity.Channel;
import com.hejia.alauda.entity.ChannelCount;
import com.hejia.alauda.entity.DayCount;
import com.hejia.alauda.persistence.BaseMapper;

public interface ChannelMapper extends BaseMapper<Channel> {

	/**
	 * 统计渠道
	 * @param map	
	 * @return
	 */
	int countChannel(Map<String, Object> map);
	
	/**
	 * 根据渠道ID列表和时间统计注册用户数
	 * @param map numbers startDate endDate
	 * @return	注册用户数
	 */
	List<ChannelCount> countRegisterByChannelsAndDate(Map<String, Object> map);
	
	/**
	 * 根据渠道ID列表和时间统计实名认证用户数
	 * @param map numbers startDate endDate
	 * @return	实名认证用户数
	 */
	List<ChannelCount> countRealNameUserByChannelsAndDate(Map<String, Object> map);
	
	/**
	 * 根据渠道ID列表和时间统计下单支付用户数
	 * @param map numbers startDate endDate
	 * @return	下单支付用户数
	 */
	List<ChannelCount> countPaidUserByChannelsAndDate(Map<String, Object> map);
	
	/**
	 * 根据渠道ID列表和时间统计下单数
	 * @param map numbers startDate endDate
	 * @return	下单数
	 */
	List<ChannelCount> countOrderByChannelsAndDate(Map<String, Object> map);
	
	/**
	 * 根据渠道ID列表和时间统计支付订单数
	 * @param map numbers startDate endDate
	 * @return	支付订单数
	 */
	List<ChannelCount> countPaidOrderByChannelsAndDate(Map<String, Object> map);
	
	/**
	 * 根据渠道ID列表和时间统计下单支付金额
	 * @param map numbers startDate endDate
	 * @return	下单支付金额
	 */
	List<ChannelCount> countPaymentAmountByChannelsAndDate(Map<String, Object> map);
	
	/**
	 * 统计复投用户数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Long countRepeatOrderUserByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计复投订单数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Long countRepeatOrderByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计复投订单金额
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	BigDecimal countRepeatOrderAmountByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);
	
	/**
	 * 统计复投用户订单数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Long countRepeatUserOrderByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计注册用户数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Long countRegisterByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计实名认证用户数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Long countRealNameByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计下单数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Long countOrderByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计支付订单数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Long countPaidOrderByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计下单支付金额
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	BigDecimal countPaymentAmountByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计下单支付用户数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Long countPaidUserByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计注册用户下单数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Long countRegisterUserOrderByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计注册用户支付数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Long countRegisterUserPaidOrderByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计注册用户订单金额
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	BigDecimal countRegisterUserPaymentAmountByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);
	
	/**
	 * 统计注册支付用户数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Long countRegisterPaidUserByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 根据渠道名称和日期统计注册用户
	 * @param map
	 * @param name		渠道名称
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @param pageSize	每页记录数
	 * @param startNumber	分页起始记录数
	 * @return
	 */
	List<ChannelCount> countRegisterByChannelNameAndDate(Map<String, Object> map);

	/**
	 * 根据渠道名称和日期统计注册用户渠道数
	 * @param map
	 * @param name		渠道名称
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	Integer countChannelByChannelNameAndDate(Map<String, Object> map);

	/**
	 * 统计渠道日注册用户数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	List<DayCount> countDailyRegisterByChannelAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计所有渠道日注册用户数
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	List<DayCount> countDailyAllRegisterByChannelAndDate(
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计渠道日新增交易用户数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	List<DayCount> countDailyNewTradeUserByChannelAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计所有渠道日新增交易用户数
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	List<DayCount> countDailyAllNewTradeUserByChannelAndDate(
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计渠道累计注册用户数
	 * @param number	渠道号
	 * @param endDate	截止日期
	 * @return
	 */
	Long countAccumulativeRegisterByChannelAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("endDate") Date endDate);

	/**
	 * 统计渠道累计交易用户数
	 * @param number	渠道号
	 * @param endDate	截止日期
	 * @return
	 */
	Long countAccumulativeTradeUserByChannelAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("endDate") Date endDate);

	/**
	 * 统计所有渠道累计交易用户数
	 * @param endDate	截止日期
	 * @return
	 */
	Long countAllAccumulativeTradeUserByChannelAndDate(Date endDate);

	/**
	 * 统计渠道日交易金额
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	List<DayCount> countDailyTradeAmountByChannelAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计所有渠道日交易金额
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	List<DayCount> countDailyAllTradeAmountByChannelAndDate(
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计渠道累计交易金额
	 * @param numbers	渠道号
	 * @param endDate	截止日期
	 * @return
	 */
	BigDecimal countAccumulativeTradeAmountByChannelAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("endDate") Date endDate);

	/**
	 * 统计渠道累计App交易用户数
	 * @param numbers	渠道号
	 * @param endDate	截止日期
	 * @return
	 */
	Long countAccumulativeAppTradeUserCountByChannelAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("endDate") Date endDate);

	/**
	 * 统计渠道日新增App交易用户数
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	List<DayCount> countDailyNewAppTradeUserCountByChannelAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);
	
	/**
	 * 统计所有渠道日新增App交易用户数
	 * @param startDate	开始日期
	 * @param endDate	截止日期
	 * @return
	 */
	List<DayCount> countDailyAllNewAppTradeUserCountByChannelAndDate(
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);
	
	/**
	 * 统计渠道指定时间注册交易用户数（包含失败交易）
	 * 
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	截止日期
	 * @return
	 */
	Long countRegisterTradeUserByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计渠道指定时间新增成功交易用户数
	 * 
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	截止日期
	 * @return
	 */
	Long countNewTradeUserByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计渠道指定时间新增成功交易订单金额
	 * 
	 * @param numbers	渠道号
	 * @param startDate	开始日期
	 * @param endDate	截止日期
	 * @return
	 */
	BigDecimal countNewTradeOrderAmountByChannelNumberAndDate(
			@Param("numbers") List<String> numbers, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计大类的访问IP数
	 * 
	 * @param biggerCategoryId	大类ID
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	@Select("select sum(vh.visitIPCount) count"
			+ " from popularizevisithourstats vh join popularize p on vh.popularizeId = p.id"
			+ " join popularizecategory c on p.category_id = c.id"
			+ " where vh.statsHour >= #{startDate}"
			+ " and vh.statsHour <= #{endDate}"
			+ " and c.bigger_id = #{biggerCategoryId}")
	Long countVisitIPByBiggerCategoryIdAndDate(
			@Param("biggerCategoryId") Long biggerCategoryId, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计大类的访问IP数
	 * 
	 * @param categoryId	类别ID
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	@Select("select sum(vh.visitIPCount) count"
			+ " from popularizevisithourstats vh join popularize p on vh.popularizeId = p.id"
			+ " join popularizecategory c on p.category_id = c.id"
			+ " where vh.statsHour >= #{startDate}"
			+ " and vh.statsHour <= #{endDate}"
			+ " and c.id = #{categoryId}")
	Long countVisitIPByCategoryIdAndDate(
			@Param("categoryId") Long categoryId, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);

	/**
	 * 统计大类的访问IP数
	 * 
	 * @param popularizeId	推广ID
	 * @param startDate	开始日期
	 * @param endDate	结束日期
	 * @return
	 */
	@Select("select sum(vh.visitIPCount) count"
			+ " from popularizevisithourstats vh join popularize p on vh.popularizeId = p.id"
			+ " where vh.statsHour >= #{startDate}"
			+ " and vh.statsHour <= #{endDate}"
			+ " and p.id = #{popularizeId}")
	Long countVisitIPByPopularizeIdAndDate(
			@Param("popularizeId") Long popularizeId, 
			@Param("startDate") Date startDate, 
			@Param("endDate") Date endDate);
}
